// 年龄推荐系统服务
// 根据用户年龄提供个性化内容推荐

// 年龄段定义
export const AGE_GROUPS = {
  Z_GENERATION: { min: 18, max: 24, name: 'Z世代' },
  YOUTH: { min: 25, max: 35, name: '青年' },
  MIDDLE_AGE: { min: 36, max: 55, name: '中年' },
  SENIOR: { min: 56, max: 120, name: '银发' },
  CHILDREN: { min: 0, max: 12, name: '儿童' },
  TEENAGER: { min: 13, max: 17, name: '青少年' }
};

// 获取用户年龄段
export function getUserAgeGroup(age) {
  for (const [group, range] of Object.entries(AGE_GROUPS)) {
    if (age >= range.min && age <= range.max) {
      return group;
    }
  }
  return null;
}

// 年龄段内容偏好配置
const AGE_GROUP_PREFERENCES = {
  [AGE_GROUPS.Z_GENERATION.name]: {
    categories: ['动漫', '游戏', '音乐', '舞蹈', '科技'],
    contentTypes: ['短视频', '直播', '互动内容'],
    themes: ['潮流', '创新', '社交', '个性表达'],
    timePreference: '碎片化',
    featurePriorities: ['互动性', '社交分享', '个性化定制']
  },
  [AGE_GROUPS.YOUTH.name]: {
    categories: ['职场', '教育', '生活', '健康', '科技'],
    contentTypes: ['教程', '纪录片', '生活方式', '专业知识'],
    themes: ['成长', '效率', '品质生活', '社交网络'],
    timePreference: '灵活时间',
    featurePriorities: ['内容深度', '实用性', '知识获取']
  },
  [AGE_GROUPS.MIDDLE_AGE.name]: {
    categories: ['健康', '财经', '历史', '文化', '家庭'],
    contentTypes: ['长视频', '深度文章', '专业讲座'],
    themes: ['价值', '经验', '家庭', '健康管理'],
    timePreference: '集中时间',
    featurePriorities: ['内容质量', '可信度', '实用性']
  },
  [AGE_GROUPS.SENIOR.name]: {
    categories: ['养生', '历史', '文化', '娱乐', '家庭'],
    contentTypes: ['长视频', '简单教程', '新闻资讯'],
    themes: ['舒适', '怀旧', '健康', '家庭亲情'],
    timePreference: '长时段',
    featurePriorities: ['易用性', '清晰易懂', '正面积极']
  },
  [AGE_GROUPS.CHILDREN.name]: {
    categories: ['教育', '动画', '游戏', '音乐'],
    contentTypes: ['短片', '互动游戏', '教育内容'],
    themes: ['趣味', '教育', '安全', '想象力'],
    timePreference: '短时段',
    featurePriorities: ['安全性', '教育价值', '互动性']
  },
  [AGE_GROUPS.TEENAGER.name]: {
    categories: ['动漫', '游戏', '音乐', '运动', '潮流'],
    contentTypes: ['短视频', '直播', '潮流文化'],
    themes: ['潮流', '社交', '探索', '自我表达'],
    timePreference: '碎片化+集中',
    featurePriorities: ['社交功能', '个性化', '新鲜体验']
  }
};

// 获取年龄组推荐配置
export function getAgeGroupPreferences(ageGroup) {
  return AGE_GROUP_PREFERENCES[ageGroup] || AGE_GROUP_PREFERENCES[AGE_GROUPS.YOUTH.name];
}

// 推荐算法 - 基于年龄的内容过滤
export function filterContentByAge(contentItems, userAge, contentMetadata = {}) {
  const ageGroup = getUserAgeGroup(userAge);
  const preferences = getAgeGroupPreferences(ageGroup ? AGE_GROUPS[ageGroup].name : AGE_GROUPS.YOUTH.name);
  
  // 基础过滤 - 内容适宜性
  let filteredContent = contentItems.filter(item => {
    // 检查内容是否适合用户年龄
    if (contentMetadata[item.id]?.ageRestriction) {
      return userAge >= contentMetadata[item.id].ageRestriction;
    }
    
    // 基于内容标签的简单过滤
    if (userAge < 18) {
      const restrictedTags = ['成人', '暴力', '恐怖', '政治敏感'];
      return !restrictedTags.some(tag => 
        item.tags && item.tags.some(itemTag => itemTag.includes(tag))
      );
    }
    
    return true;
  });
  
  // 基于偏好的排序 - 为不同年龄组优先展示其偏好内容
  filteredContent.sort((a, b) => {
    let aScore = 0;
    let bScore = 0;
    
    // 根据类别匹配度加分
    if (preferences.categories) {
      aScore += (a.category && preferences.categories.includes(a.category)) ? 3 : 0;
      bScore += (b.category && preferences.categories.includes(b.category)) ? 3 : 0;
    }
    
    // 根据内容类型加分
    if (preferences.contentTypes) {
      aScore += (a.type && preferences.contentTypes.includes(a.type)) ? 2 : 0;
      bScore += (b.type && preferences.contentTypes.includes(b.type)) ? 2 : 0;
    }
    
    // 根据标签加分
    if (preferences.themes && a.tags) {
      aScore += a.tags.filter(tag => preferences.themes.includes(tag)).length;
    }
    if (preferences.themes && b.tags) {
      bScore += b.tags.filter(tag => preferences.themes.includes(tag)).length;
    }
    
    // 默认按流行度排序
    if (aScore === bScore) {
      return (b.views || 0) - (a.views || 0);
    }
    
    return bScore - aScore;
  });
  
  return filteredContent;
}

// 个性化推荐生成器
export function generatePersonalizedRecommendations(userData, availableContent, options = {}) {
  const {
    limit = 20,
    includeTrending = true,
    includeCategories = true,
    includeAgeSpecific = true,
    includeHistory = true,
    diversityFactor = 0.3 // 多样性因子，0-1之间，越大越多样化
  } = options;
  
  let recommendations = [];
  
  // 如果用户已登录且有年龄信息
  if (userData && userData.age) {
    // 基于年龄的内容过滤
    if (includeAgeSpecific) {
      recommendations = filterContentByAge(availableContent, userData.age);
    } else {
      recommendations = [...availableContent];
    }
    
    // 计算内容相关度得分
    const scoredContent = recommendations.map(item => {
      let score = 0;
      
      // 1. 兴趣标签匹配得分
      if (userData.interests && userData.interests.length > 0 && item.tags) {
        const matchedTags = item.tags.filter(tag => userData.interests.includes(tag));
        score += matchedTags.length * 10;
        
        // 完全匹配加分
        if (matchedTags.length === userData.interests.length) {
          score += 5;
        }
      }
      
      // 2. 观看历史相关度（如果有）
      if (includeHistory && userData.viewingHistory && userData.viewingHistory.length > 0) {
        // 基于历史观看的相似内容推荐
        const similarHistoryItems = userData.viewingHistory.filter(history => 
          history.category === item.category || 
          (item.tags && history.tags && item.tags.some(tag => history.tags.includes(tag)))
        );
        score += similarHistoryItems.length * 3;
      }
      
      // 3. 内容质量得分
      score += (item.views || 0) / 10000; // 观看量
      score += (item.likes || 0) / 5000;   // 点赞数
      score += (item.bulletCount || 0) / 2000; // 弹幕数
      
      // 4. 新鲜度得分
      if (item.createdDate) {
        const daysSinceCreation = (Date.now() - new Date(item.createdDate).getTime()) / (1000 * 60 * 60 * 24);
        score += Math.max(0, 100 - daysSinceCreation) * 0.1;
      }
      
      // 5. 作者偏好得分
      if (userData.followedAuthors && item.author && userData.followedAuthors.includes(item.author)) {
        score += 20; // 关注的作者优先
      }
      
      return { item, score };
    });
    
    // 排序
    scoredContent.sort((a, b) => b.score - a.score);
    
    // 应用多样性策略
    if (options.diversityFactor > 0) {
      const diverseRecommendations = [];
      const selectedCategories = new Set();
      const selectedAuthors = new Set();
      
      // 首先选择最高分的内容
      scoredContent.forEach(({ item, score }) => {
        if (diverseRecommendations.length >= limit) return;
        
        // 计算内容多样性
        const categoryWeight = selectedCategories.has(item.category) ? 0.3 : 1;
        const authorWeight = selectedAuthors.has(item.author) ? 0.5 : 1;
        
        // 根据多样性因子决定是否选择
        const diversityScore = score * categoryWeight * authorWeight;
        
        // 随机因子，增加多样性
        const randomFactor = Math.random();
        
        if (randomFactor > options.diversityFactor || diverseRecommendations.length < limit * (1 - options.diversityFactor)) {
          diverseRecommendations.push(item);
          if (item.category) selectedCategories.add(item.category);
          if (item.author) selectedAuthors.add(item.author);
        }
      });
      
      // 如果多样性策略没有选择足够的内容，从剩余的高分内容中补充
      let i = 0;
      while (diverseRecommendations.length < limit && i < scoredContent.length) {
        const { item } = scoredContent[i];
        if (!diverseRecommendations.includes(item)) {
          diverseRecommendations.push(item);
        }
        i++;
      }
      
      recommendations = diverseRecommendations;
    } else {
      recommendations = scoredContent.slice(0, limit).map(item => item.item);
    }
  } else {
    // 未登录用户 - 返回热门内容，同时考虑多样性
    recommendations = [...availableContent]
      .sort((a, b) => {
        // 综合考虑观看量、点赞数和新鲜度
        const aScore = (a.views || 0) + (a.likes || 0) * 2;
        const bScore = (b.views || 0) + (b.likes || 0) * 2;
        return bScore - aScore;
      })
      .slice(0, limit);
  }
  
  return recommendations;
}

// 跨年龄段通用推荐策略
export function getUniversalRecommendations(contentItems, options = {}) {
  const {
    limit = 10,
    categories = []
  } = options;
  
  let filtered = [...contentItems];
  
  // 按类别过滤
  if (categories.length > 0) {
    filtered = filtered.filter(item => item.category && categories.includes(item.category));
  }
  
  // 通用排序策略 - 混合考虑流行度、新鲜度和质量
  filtered.sort((a, b) => {
    // 计算综合得分
    const calculateScore = (item) => {
      let score = 0;
      
      // 流行度得分
      score += (item.views || 0) / 10000;
      
      // 新鲜度得分（假设item.createdDate存在）
      if (item.createdDate) {
        const daysSinceCreation = (Date.now() - new Date(item.createdDate).getTime()) / (1000 * 60 * 60 * 24);
        score += Math.max(0, 100 - daysSinceCreation);
      }
      
      // 互动质量得分
      score += (item.likes || 0) / 100;
      score += (item.comments || 0) * 5;
      
      return score;
    };
    
    return calculateScore(b) - calculateScore(a);
  });
  
  return filtered.slice(0, limit);
}

// 激励体系 - 基于年龄的参与建议
export function getAgeBasedEngagementSuggestions(ageGroup) {
  const suggestions = {
    [AGE_GROUPS.Z_GENERATION.name]: [
      '参与UGC内容创作，展示个性',
      '加入兴趣社群，扩展社交圈',
      '参与互动挑战和活动',
      '体验最新功能和特效'
    ],
    [AGE_GROUPS.YOUTH.name]: [
      '学习专业技能课程',
      '参与职场经验分享',
      '创建个人学习计划',
      '探索实用生活技巧'
    ],
    [AGE_GROUPS.MIDDLE_AGE.name]: [
      '加入知识分享社区',
      '参与经验交流活动',
      '学习健康管理知识',
      '探索文化艺术内容'
    ],
    [AGE_GROUPS.SENIOR.name]: [
      '参与轻松有趣的互动',
      '学习简单实用的技能',
      '分享人生经验和故事',
      '观看健康养生内容'
    ],
    [AGE_GROUPS.CHILDREN.name]: [
      '参与趣味学习挑战',
      '观看教育动画内容',
      '培养良好学习习惯',
      '安全探索知识世界'
    ],
    [AGE_GROUPS.TEENAGER.name]: [
      '参与创意内容创作',
      '加入兴趣爱好社群',
      '学习新技能和知识',
      '探索潮流文化趋势'
    ]
  };
  
  return suggestions[ageGroup] || suggestions[AGE_GROUPS.YOUTH.name];
}

// 导出默认服务对象
// 用户兴趣标签管理
export function getUserInterestTags(userData) {
  if (!userData || !userData.interests || userData.interests.length === 0) {
    return [];
  }
  return userData.interests;
}

// 更新用户兴趣标签
export function updateUserInterests(userId, interests) {
  try {
    // 实际应用中应该调用API更新后端数据
    const registeredUsers = JSON.parse(localStorage.getItem('registeredUsers') || '[]');
    const userIndex = registeredUsers.findIndex(user => user.id === userId || user.username === userId);
    
    if (userIndex !== -1) {
      registeredUsers[userIndex].interests = interests;
      localStorage.setItem('registeredUsers', JSON.stringify(registeredUsers));
      return true;
    }
    return false;
  } catch (error) {
    console.error('更新用户兴趣标签失败:', error);
    return false;
  }
}

// 基于用户行为自动推断兴趣标签
export function inferUserInterests(viewingHistory, options = { minViews: 3 }) {
  if (!viewingHistory || viewingHistory.length < options.minViews) {
    return [];
  }
  
  // 统计标签出现频率
  const tagCounts = {};
  
  viewingHistory.forEach(item => {
    if (item.tags && item.tags.length > 0) {
      item.tags.forEach(tag => {
        tagCounts[tag] = (tagCounts[tag] || 0) + 1;
      });
    }
  });
  
  // 按频率排序并返回前N个标签
  const sortedTags = Object.entries(tagCounts)
    .sort((a, b) => b[1] - a[1])
    .map(([tag, count]) => tag)
    .slice(0, 10); // 最多返回10个标签
  
  return sortedTags;
}

// 获取推荐的兴趣标签（基于用户当前兴趣和热门趋势）
export function getRecommendedInterestTags(userInterests = [], popularTags = []) {
  // 合并用户当前兴趣和热门标签
  const allTags = [...new Set([...userInterests, ...popularTags])];
  
  // 过滤掉用户已经选择的标签
  return allTags.filter(tag => !userInterests.includes(tag)).slice(0, 15);
}

export default {
  getUserAgeGroup,
  getAgeGroupPreferences,
  filterContentByAge,
  generatePersonalizedRecommendations,
  getUniversalRecommendations,
  getAgeBasedEngagementSuggestions,
  getUserInterestTags,
  updateUserInterests,
  inferUserInterests,
  getRecommendedInterestTags,
  AGE_GROUPS
};
